package com.huahua.api.service.entertainment.impl;

import com.huahua.api.entity.dto.DmxApiContent;
import com.huahua.api.entity.dto.DmxApiMessageV2;
import com.huahua.api.entity.dto.DmxApiRequestV2;
import com.huahua.api.exception.CommonException;
import com.huahua.api.service.DmxApiService;
import com.huahua.api.service.entertainment.PalmReadingService;
import com.huahua.api.util.CheckUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 看手相服务实现
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class PalmReadingServiceImpl implements PalmReadingService {

    private final DmxApiService dmxApiService;

    private static final String PALM_READING_PROMPT = """
            你是一位经验丰富的手相大师，拥有30年的手相学研究经验。请仔细观察用户提供的手掌照片，从以下几个方面进行详细分析：
            
            1. 生命线：分析生命线的长度、深浅、清晰度，以及是否有岛纹、断裂等特征
            2. 智慧线：观察智慧线的走向、长度、分叉情况，分析智力发展和思维特点
            3. 感情线：查看感情线的起点、终点、弯曲程度，解读感情运势和性格特征
            4. 事业线：如果有事业线，分析其起点、走向、清晰度，预测事业发展
            5. 婚姻线：观察婚姻线的数量、长短、清晰度，分析婚姻状况
            6. 财运线：查看是否有财运线，分析财运走势
            7. 健康线：观察健康线的状态，提供健康建议
            8. 手掌形状：分析手掌的整体形状（方形、圆形、长形等）及其含义
            9. 手指特征：观察手指的长短、粗细、关节特点
            10. 掌丘：分析各个掌丘的饱满程度及其代表的意义
            
            请用通俗易懂的语言，以温和友善的语气进行解读。在分析时要积极正面，多给予鼓励和建议。
            记住：手相只是参考，人的命运掌握在自己手中！
            """;

    @Override
    public Flux<String> analyzePalm(String imageUrl) {
        CheckUtil.checkStrNotBlank(imageUrl, new CommonException("图片地址不能为空"));
        CheckUtil.checkTrue(imageUrl.startsWith("http://") || imageUrl.startsWith("https://"),
                new CommonException("图片地址必须是有效的HTTP或HTTPS链接"));

        List<DmxApiContent> systemContent = Collections.singletonList(
                DmxApiContent.builder()
                        .type("text")
                        .text(PALM_READING_PROMPT)
                        .build()
        );

        List<DmxApiContent> userContent = Collections.singletonList(
                DmxApiContent.builder()
                        .type("image_url")
                        .imageUrl(DmxApiContent.ImageUrl.builder()
                                .url(imageUrl)
                                .build())
                        .build()
        );

        DmxApiRequestV2 request = DmxApiRequestV2.builder()
                .model("qwen-vl-max")
                .stream(true)
                .user("DMXAPI")
                .messages(Arrays.asList(
                        DmxApiMessageV2.builder()
                                .role("system")
                                .content(systemContent)
                                .build(),
                        DmxApiMessageV2.builder()
                                .role("user")
                                .content(userContent)
                                .build()
                ))
                .build();

        return dmxApiService.chatCompletions(request)
                .doOnError(e -> log.error("调用手相分析API失败", e))
                .doOnComplete(() -> log.debug("手相分析完成"));
    }
}
